package grafica;
import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Rectangle;

import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.JButton;

import org.math.plot.Plot2DPanel;

import funciones.DLG;

import javax.swing.JOptionPane;
import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JRadioButton;
import javax.swing.WindowConstants;

/**
 * @author leonardo
 */
public class GraficadorDLG extends JFrame implements ActionListener {
	private DLG dlg=new DLG();  //  @jve:decl-index=0:
	private double[] x_coord,y_coord,u_coord;
	private Plot2DPanel plot = new Plot2DPanel();

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JButton borrar = null;
	private JCheckBox seleccionTodos = null;
	private JCheckBox seleccionDensidad;  //  @jve:decl-index=0:
	Vector graficas = new Vector();  //  @jve:decl-index=0:
	Vector leyendas= new Vector();  //  @jve:decl-index=0:

	/**
	 * Constructor
	 */
	public GraficadorDLG() {
		super();
		plot.addLegend("east");
		//plot.setLegendOrientation(opcion);
		initialize();
		setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
	}

	public void graficar(String leyenda, double la1,double la2,double la3,double la4) {
		seleccionDensidad.setSelected(true);
		
		dlg.la1=la1;
		dlg.la2=la2;
		dlg.la3=la3;
		dlg.la4=la4;

		if (dlg.sonLambdasValidos()) {
			// u entre 0 y 1 (1/n a n-1/n)
			double numx = (double)(plot.plotCanvas.getWidth());   
			double x,y;

			nuevaCoordXY((int)numx);
			int i=0;
			for (double u = 1.0/numx; u <= (1.0-(1.0/numx))&&i<numx; u += 1.0/numx,i++) {  
				x = dlg.fpercentil(u);
				y = dlg.fdensidad(u);
				x_coord[i]=x;
				y_coord[i]=y;
			}
			ordenarXY();

			//plot.addLinePlot("( x , fx(x) )", x_coord, y_coord);
			plot.addLinePlot(leyenda, x_coord, y_coord);
			//plot.addPlot(PlotPanel.LINE,"( x , Fx(x) )", x_coord, Fx_coord);
			//plot.addLinePlot("( x , Fx(x) )", x_coord, Fx_coord);
			graficas.add(new double[]{la1,la2,la3,la4});
			leyendas.add(leyenda);
		}else
			JOptionPane.showMessageDialog(this, "Lambdas invalidos","Solucion incorrecta",JOptionPane.ERROR_MESSAGE);
	}

	private void ordenarXY() {
		for (int i = 0; i < x_coord.length-1; i++) {
			if (x_coord[i] > x_coord[i + 1]) {
				double  temp = x_coord[i];
				x_coord[i] = x_coord[i+1];
				x_coord[i+1] = temp;
				double  temp2 = y_coord[i];
				y_coord[i] = y_coord[i+1];
				y_coord[i+1] = temp2;
				if (i > 0) {
					i -= 2;
				}
			}
		}
	}

	private void ordenarXU() {
		for (int i = 0; i < x_coord.length-1; i++) {
			if (x_coord[i] > x_coord[i + 1]) {
				double  temp = x_coord[i];
				x_coord[i] = x_coord[i+1];
				x_coord[i+1] = temp;
				double  temp3 = u_coord[i];
				u_coord[i] = u_coord[i+1];
				u_coord[i+1] = temp3;

				if (i > 0) {
					i -= 2;
				}
			}
		}
	}

	protected void graficarDistribuciones() {
		if(plot.plotCanvas.plots.isEmpty()) return;
		plot.removeAllPlots();
		for (int k = 0; k < graficas.size(); k++) {
			double[] la=(double[])graficas.get(k);
			dlg.la1=la[0];
			dlg.la2=la[1];
			dlg.la3=la[2];
			dlg.la4=la[3];
			// u entre 0 y 1 (1/n a n-1/n)
			double numx = (double)(plot.plotCanvas.getWidth());   
			nuevaCoordXU((int)numx);
			int i=0;
			for (double u = 1.0/numx; u <= (1.0-(1.0/numx))&&i<numx; u += 1.0/numx,i++) {  
				u_coord[i]=u;
				x_coord[i]=dlg.fpercentil(u);
			}
			ordenarXU();
			plot.addLinePlot((String)leyendas.get(k), x_coord, u_coord);
		}
	}

	private void nuevaCoordXU(int numx) {
		if(x_coord!=null&&u_coord!=null&&x_coord.length==numx&&u_coord.length==numx){
			for (int i = 0; i < x_coord.length; i++) {
				x_coord[i]=0;
				u_coord[i]=0;				
			}
		}else{
			x_coord=new double[numx];
			u_coord=new double[numx];
		}
	}

	private void nuevaCoordXY(int numx) {
		if(x_coord!=null&&y_coord!=null&&x_coord.length==numx&&y_coord.length==numx){
			for (int i = 0; i < x_coord.length; i++) {
				x_coord[i]=0;
				y_coord[i]=0;				
			}
		}else{
			x_coord=new double[numx];
			y_coord=new double[numx];
		}
	}
	
	protected void graficarDensidades() {
		if(plot.plotCanvas.plots.isEmpty()) return;
		plot.removeAllPlots();
		for (int k = 0; k < graficas.size(); k++) {
			double[] la=(double[])graficas.get(k);
			dlg.la1=la[0];
			dlg.la2=la[1];
			dlg.la3=la[2];
			dlg.la4=la[3];

			// u entre 0 y 1 (1/n a n-1/n)
			double numx = (double)(plot.plotCanvas.getWidth());   
			double x,y;
	
			nuevaCoordXY((int)numx);
			int i=0;
			for (double u = 1.0/numx; u <= (1.0-(1.0/numx))&&i<numx; u += 1.0/numx,i++) {  
				x = dlg.fpercentil(u);
				y = dlg.fdensidad(u);
				x_coord[i]=x;
				y_coord[i]=y;
			}
			ordenarXY();
			plot.addLinePlot((String)leyendas.get(k), x_coord, y_coord);
		}
	}


	/**********************************************************************
	 * GUI
	 *********************************************************************/

	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==getBorrar()){
			if(plot.plotCanvas.plots.isEmpty()) return;
			for (int i = 0; i < plot.plotCanvas.plots.size(); i++) {
				if (plot.getPlot(i).noted) {
					plot.removePlot(i);
					graficas.remove(i);
					leyendas.remove(i);
					i--;
				}					
			}
		}
	}

	private JCheckBox getSeleccionTodos() {
		if (seleccionTodos == null) {
			seleccionTodos = new JCheckBox();
			seleccionTodos.setText("Todos");
			seleccionTodos.addItemListener(new java.awt.event.ItemListener() {
				public void itemStateChanged(java.awt.event.ItemEvent e) {
					if(plot.plotCanvas.plots.isEmpty()) return;
					if(seleccionTodos.isSelected()){
						for (int i = 0; i < plot.plotCanvas.plots.size(); i++) {
							plot.plotLegend.note(i);//selecciona el plot i-esimo
							plot.getPlot(i).noted=true;
						}
					}else{
						for (int i = 0; i < plot.plotCanvas.plots.size(); i++) {
							plot.plotLegend.nonote(i);//deselecciona el plot i-esimo
							plot.getPlot(i).noted=false;
						}
					}
				}
			});
		}
		return seleccionTodos;
	}

	private void initialize() {
		this.setSize(new Dimension(588, 372));
		this.setContentPane(getJContentPane());
		this.setTitle("Graficador");
		plot.plotToolBar.add(getBorrar(),0);
		plot.plotToolBar.add(getSeleccionTodos(),1);
		plot.plotToolBar.add(getSeleccionDensidad(),2);
	}

	private JButton getBorrar() {
		if (borrar == null) {
			borrar = new JButton();
			borrar.setText("");
			borrar.setIcon(new ImageIcon(getClass().getResource("/grafica/eliminar.gif")));
			borrar.setToolTipText("borrar");
			borrar.setBackground(Color.WHITE);
			borrar.addActionListener(this);
		}
		return borrar;
	}


	private JCheckBox getSeleccionDensidad() {
		if (seleccionDensidad == null) {
			seleccionDensidad = new JCheckBox();
			seleccionDensidad.setText("Graficas-Densidad f(x)");
			seleccionDensidad.addItemListener(new java.awt.event.ItemListener() {
				public void itemStateChanged(java.awt.event.ItemEvent e) {
					if(plot.plotCanvas.plots.isEmpty()) return;
					if(!seleccionDensidad.isSelected()){
						graficarDistribuciones();
						seleccionDensidad.setText("Graficas-Distribucion F(x)");
					}else{
						graficarDensidades();
						seleccionDensidad.setText("Graficas-Densidad f(x)");
					}
				}
			});
		}
		return seleccionDensidad;
	}

	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(plot, BorderLayout.CENTER);
		}
		return jContentPane;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				GraficadorDLG thisClass = new GraficadorDLG();
				thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				thisClass.setVisible(true);
			}
		});
	}
}  //  @jve:decl-index=0:visual-constraint="27,14"
/*if(e.getSource()==color){
if(plot.plotCanvas.plots.isEmpty()) return;
if(v)plot.changePlotColor(0,Color.green);
else plot.changePlotColor(0,Color.black);
v=!v;

}else */

//plot.plotCanvas.addLabel("momentos", Color.blue,new double[1.0,2.0]);
/*
	public void note(int i) {
		if (orientation != INVISIBLE) {
			legends[i].setBackground(PlotCanvas.NOTE_COLOR);
			legends[i].name.setForeground(plotPanel.getBackground());
		}
	}
 */

/*
// add a line plot to the PlotPanel
plot.addLinePlot("1", x, y);
plot.addLinePlot("2", x1, y1);

plot.addPlot(PlotPanel.LINE, "3", new double[][]{{1,2},{2,100},{-32,12},{1,2}});//lineas
//plot.addPlot(PlotPanel.STAIRCASE, "name", new double[][]{{1,2},{2,100},{-32,12},{1,2}});//cuadrado
plot.addPlot(PlotPanel.SCATTER, "4", new double[][]{{1,2},{2,100},{-32,12},{1,2}});//puntos
//plot.plotCanvas.getPlot(0).setColor(Color.orange);
//plot.plotCanvas.setEditable(true);
//plot.removePlot(0);
//plot.removePlot(0);*/


/*
			graficar = new JButton();
			graficar.setIcon(new ImageIcon(getClass().getResource("/grafica/grafica.jpg")));
			graficar.setToolTipText("graficar");
			graficar.setBackground(Color.WHITE);
			graficar.addActionListener(this);

 */